#include "qcoloritem.h"
#include<QApplication>
#include<QRandomGenerator>
#include<QCursor>
#include<QPainter>
#include<QGraphicsSceneMouseEvent>
#include<QDrag>
#include<QMimeData>
#include<QImage>
#include<QPixmap>
#include<QLatin1Char>
#include<QWidget>

QColorItem::QColorItem(QGraphicsItem *parent)
    : QGraphicsItem(parent)
    ,m_Color(QRandomGenerator::global()->bounded(256),
              QRandomGenerator::global()->bounded(256),
              QRandomGenerator::global()->bounded(256))
{
    // 设置工具提示,显示颜色值和提示信息
    setToolTip(QString("QColor(%1,%2,%3)\n%4").arg(m_Color.red()).arg(m_Color.green())
                   .arg(m_Color.blue()).arg(m_Color.alpha()));
    // 设置光标为张开的手
    setCursor(Qt::OpenHandCursor);
    // 设置只接受鼠标左键事件
    setAcceptedMouseButtons(Qt::LeftButton);

}

QRectF QColorItem::boundingRect() const
{
    return QRectF(-15.5,-15.5,34,34);

}

void QColorItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    // 忽略未使用的参数
    Q_UNUSED(option);
    Q_UNUSED(widget);
    // 设置画笔为无
    painter->setPen(Qt::NoPen);
    // 设置画刷为灰黑色
    painter->setBrush(Qt::darkGray);
    // 绘制内圆
    painter->drawEllipse(-12,-12,30,30);
    painter->setPen(QPen(Qt::black,1));
    painter->setBrush(QBrush(m_Color));
    painter->drawEllipse(-15,-15,30,30);

}

void QColorItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    Q_UNUSED(event);
    // 设置光标为闭合的手
    setCursor(Qt::ClosedHandCursor);
}

void QColorItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    Q_UNUSED(event);
    // 设置光标为张开的手
    setCursor(Qt::OpenHandCursor);
}

void QColorItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    // 如果鼠标移动的距离小于拖动起始距离，则不进行拖动
    if(QLineF(event->scenePos(),event->buttonDownScreenPos(Qt::LeftButton)).length() < QApplication::startDragDistance())
    {
        return;
    }

    QDrag* pDrag = new QDrag(event->widget()); // 创建拖动对象
    QMimeData* pMimiData = new QMimeData();    // 创建Mime对象
    pDrag->setMimeData(pMimiData);             // 设置拖动对象的MIME数据

    static int n = 0;
    if(n++ > 2 && QRandomGenerator::global()->bounded(3) == 0)
    {
        // 加载图像
        QImage Image(":/Image/Head.png");
        // 设置MIME数据为图像
        pMimiData->setImageData(Image);
        // 设置拖动对象的像素图
        pDrag->setPixmap(QPixmap::fromImage(Image).scaled(30,40));
        // 设置热点
        pDrag->setHotSpot(QPoint(15,30));
    }
    else
    {
        // 设置MIME颜色
        pMimiData->setColorData(m_Color);
        // 设置文本
        pMimiData->setText(QString("%1%2%3")
                               .arg(m_Color.red(),2,16,QLatin1Char('0'))
                               .arg(m_Color.green(),2,16,QLatin1Char('0'))
                               .arg(m_Color.blue(),2,16,QLatin1Char('0')));

        // 创建像素图
        QPixmap pixmap(34,34);
        // 填充为白色
        pixmap.fill(Qt::white);

        // 创建画家对象
        QPainter painter(&pixmap);
        // 平移坐标系
        painter.translate(15,15);
        // 设置抗锯齿
        painter.setRenderHint(QPainter::Antialiasing);
        // 绘制图形项
        paint(&painter,nullptr,nullptr);
        // 结束绘制
        painter.end();

        // 设置掩码
        pixmap.setMask(pixmap.createHeuristicMask());
        // 设置拖动对象像素图
        pDrag->setPixmap(pixmap);
        // 设置热点
        pDrag->setHotSpot(QPoint(15,30));
    }

    // 执行拖动操作
    pDrag->exec();
    // 设置光标为张开的手
    setCursor(Qt::OpenHandCursor);
}
